package com.spring.redis.operation.service;

import com.spring.redis.operation.service.base.ZSetRedisBaseService;
import org.springframework.data.redis.core.ZSetOperations;

import java.util.Set;

/**
 * redis Operation zset interface
 *
 * @author zhouyu
 */
public interface ZSetRedisService extends ZSetRedisBaseService {

    /**
     * 添加一个元素
     *
     * @param className 类名称
     * @param key       key
     * @param value     value
     * @param score     score
     * @return java.lang.Boolean 是否添加成功
     */
    Boolean add(String className, String key, String value, double score);

    /**
     * 添加一个元素
     *
     * @param clazz 类名称
     * @param key   key
     * @param value value
     * @param score score
     * @return java.lang.Boolean 是否添加成功
     */
    Boolean add(Class<?> clazz, String key, String value, double score);

    /**
     * 删除元素
     *
     * @param className 类名称
     * @param key       key
     * @param values    values
     * @return java.lang.Long
     */
    Long remove(String className, String key, Object... values);

    /**
     * 删除元素
     *
     * @param clazz  类名称
     * @param key    key
     * @param values values
     * @return java.lang.Long
     */
    Long remove(Class<?> clazz, String key, Object... values);

    /**
     * 增加或减少score
     *
     * @param className 类名称
     * @param key       key
     * @param value     value
     * @param score     score
     * @return java.lang.Double
     */
    Double incrementScore(String className, String key, String value, double score);

    /**
     * 增加或减少score
     *
     * @param clazz 类名称
     * @param key   key
     * @param value value
     * @param score score
     * @return java.lang.Double
     */
    Double incrementScore(Class<?> clazz, String key, String value, double score);

    /**
     * 查询value对应的score
     *
     * @param className 类名称
     * @param key       key
     * @param value     value
     * @return java.lang.Double
     */
    Double score(String className, String key, String value);

    /**
     * 查询value对应的score
     *
     * @param clazz 类名称
     * @param key   key
     * @param value value
     * @return java.lang.Double
     */
    Double score(Class<?> clazz, String key, String value);

    /**
     * 获取value在zset中的排名
     *
     * @param className 类名称
     * @param key       key
     * @param value     value
     * @return java.lang.Long 排名值
     */
    Long rank(String className, String key, String value);

    /**
     * 获取value在zset中的排名
     *
     * @param clazz 类名称
     * @param key   key
     * @param value value
     * @return java.lang.Long 排名值
     */
    Long rank(Class<?> clazz, String key, String value);

    /**
     * 返回集合的长度
     *
     * @param className 类名称
     * @param key       key
     * @return java.lang.Long 长度值
     */
    Long size(String className, String key);

    /**
     * 返回集合的长度
     *
     * @param clazz 类名称
     * @param key   key
     * @return java.lang.Long 长度值
     */
    Long size(Class<?> clazz, String key);

    /**
     * 查询集合中指定顺序的值, 0 -1 表示获取全部的集合内容,返回有序的集合，score小的在前面
     *
     * @param className 类名称
     * @param key       key
     * @param start     start
     * @param end       end
     * @return java.util.Set
     */
    Set<Object> range(String className, String key, int start, int end);

    /**
     * 查询集合中指定顺序的值, 0 -1 表示获取全部的集合内容,返回有序的集合，score小的在前面
     *
     * @param clazz 类名称
     * @param key   key
     * @param start start
     * @param end   end
     * @return java.util.Set
     */
    Set<Object> range(Class<?> clazz, String key, int start, int end);

    /**
     * 查询集合中指定顺序的值和score，0, -1 表示获取全部的集合内容
     *
     * @param className 类名称
     * @param key       key
     * @param start     start
     * @param end       end
     * @return java.util.Set
     */
    Set<ZSetOperations.TypedTuple<Object>> rangeWithScore(String className, String key, int start, int end);

    /**
     * 查询集合中指定顺序的值和score，0, -1 表示获取全部的集合内容
     *
     * @param clazz 类名称
     * @param key   key
     * @param start start
     * @param end   end
     * @return java.util.Set
     */
    Set<ZSetOperations.TypedTuple<Object>> rangeWithScore(Class<?> clazz, String key, int start, int end);

    /**
     * 查询集合中指定顺序的值,返回有序的集合中,score大的在前面
     *
     * @param className 类名称
     * @param key       key
     * @param start     key
     * @param end       end
     * @return java.util.Set 满足条件的集合
     */
    Set<Object> reverseRange(String className, String key, int start, int end);

    /**
     * 查询集合中指定顺序的值,返回有序的集合中,score大的在前面
     *
     * @param clazz 类名称
     * @param key   key
     * @param start key
     * @param end   end
     * @return java.util.Set 满足条件的集合
     */
    Set<Object> reverseRange(Class<?> clazz, String key, int start, int end);

    /**
     * 根据score的值，来获取满足条件的集合
     *
     * @param className 类名称
     * @param key       key
     * @param min       min
     * @param max       max
     * @return java.util.Set 满足条件的集合
     */
    Set<Object> rangeByScore(String className, String key, int min, int max);

    /**
     * 根据score的值，来获取满足条件的集合
     *
     * @param clazz 类名称
     * @param key   key
     * @param min   min
     * @param max   max
     * @return java.util.Set 满足条件的集合
     */
    Set<Object> rangeByScore(Class<?> clazz, String key, int min, int max);
}
